package com.zhou.common.quartz.test.wheel;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.util.Timer;
import java.util.TimerTask;

/**
 * 思想非常好
 * 缺点
 * 1.是单线程的，任务会被阻塞，如果线程都执行的很快，则可以使用
 * 2.是如果执行出现异常，Timer 并不会捕获，会导致线程终止，其他任务永远不会执行。
 * 3.Timer 的任务调度是基于系统绝对时间的，如果系统时间不正确，可能会出现问题。
 * <p>
 * 要点：
 * 1.小顶堆的排序方式
 *
 * @author xianfeng
 * @date 2023/12/17 14:41
 * @description:
 */
@Slf4j
public class JdkTimer {

    @Test
    public void testNormal() {
        Timer timer = new Timer();
        log.info("开始执行任务");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                log.info("任务执行了");
            }
        }, 10000);

        ThreadUtil.sleep(1000 * 1000);
    }

    @Test
    public void testBatch() {
        Timer timer = new Timer();
        for (int i = 0; i < 10; i++) {
            int delay = RandomUtil.randomInt(300, 25 * 1000);
            String taskName = StrUtil.format("任务{}，{}ms后执行", 1 + i, delay);
            log.info(taskName);
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    log.info("任务执行了,{}", taskName);
                }
            }, delay);
        }
        ThreadUtil.sleep(1000 * 1000);
    }

    @Test
    public void testBigBatch() {
        Timer timer = new Timer();
        for (int i = 0; i < 10000; i++) {
            int delay = RandomUtil.randomInt(300, 25 * 1000);
            String taskName = StrUtil.format("任务{}，{}ms后执行", 1 + i, delay);
            log.info(taskName);
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    log.info("任务执行了,{}", taskName);
                }
            }, delay);
        }
        ThreadUtil.sleep(1000 * 1000);
    }

    @Test
    public void testCron() {
        int i = 2;
        i <<= 1;
        log.info("{}", i);
    }


}
